/**
 * 汉诺塔（64个圆盘与3个柱子构成） 移动时（不允许大盘放在盘上面）。
 * 递归算法演示
 *
 * 分析问题，找出移动盘子的正确算法
 * 首先考虑a杆最下面的盘子而非杆上最上面的盘子，于是任务就变成了：
 * - 将上面的63个盘子移动到b杆商；
 * - 将a杆上剩下的盘子移动到c杆上；
 * - 将b赶上的盘子移动到c杆上。
 * 将这个过程不停重复下去。
 *
 * 为了更加清楚地描述算法，可以定义一个函数movedisc(n,a,b,c)。 该函数的功能是：
 * 将N个盘子从A杆上借助C杆移动到B杆子上。这样移动N个盘子的工作就可以描述为
 *
 * 1. movedisc(n-1,a,c,b)
 * 2. 将一个盘子从a杆移动到b杆上
 * 3. movedisc(n-1,c,b,a)
 */

#include <stdio.h>

void movedisc(int n, char from, char to, char pole);

int i = 0;
int main()
{
    unsigned int n;
    printf("Please enter the number of discs: ");
    scanf("%d", &n);
    printf("\tneedle:\ta\t b\t c\n");
    movedisc(n, 'a', 'c', 'b');
    printf("\t Total:%d\n", i);
}

void movedisc(int n, char from, char to, char pole)
{
    if (n > 0)
    {
        // 从from借助to将N-1个盘子移动到using上
        movedisc(n - 1, from, pole, to);
        ++i;
        switch (from)
        {
        case 'a':
            switch (to)
            {
            case 'b':
                printf("\t[%d]:\t%2d----->%2d\n", i, n, n);
                break;
            case 'c':
                printf("\t[%d]:\t%2d------------->%2d\n", i, n, n);
                break;
            }
            break;
        case 'b':
            switch (to)
            {
            case 'a':
                printf("\t[%d]:\t%2d<-----%2d\n", i, n, n);
                break;
            case 'c':
                printf("\t[%d]:\t\t%2d----->%2d\n", i, n, n);
                break;
            }
            break;
        case 'c':
            switch (to)
            {
            case 'a':
                printf("\t[%d]:\t%2d<-------------%2d\n", i, n, n);
                break;
            case 'b':
                printf("\t[%d]:\t\t%2d<-----%2d\n", i, n, n);
                break;
            }
            break;
        }

        movedisc(n - 1, pole, to, from);
    }
}